//
//  CZStatusViewModel.swift
//  WHWeiBo01
//
//  Created by whitcast on 16/7/13.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit
//  处理微博模型显示的内容, 对应的视图是 首页自定义cell
class CZStatusViewModel: NSObject {
    
    //  在这里面出事显示内容的逻辑 .....
    
    //  转发数显示内容
    var retweetStr: String?
    //  评论数显示内容
    var commentStr: String?
    //  赞数显示内容
    var unlikeStr: String?
    //  处理转发微博内容拼接"@xx:xxxx"
    var retweetContent: String?
    //  会员等级图片
    var mbrandImage: UIImage?
    //  来源内容
    var sourceContent: String?
    //  认证类型等级图片
    var verifiedTypeImage: UIImage?
    //  考虑计算属性 - 原因是每次滚动cell的都需要跟我们的当前时间进行对比
    
    /*
        1. 把时间对象转成需要字符串
            
            如果是今年
                判断是否是今天
                    判断是否是在1分钟之前
                        - 刚刚
                    判断是否是在1小时之前
                        - xxx分钟前
                    其它
                        - xx小时前
    
                判断是否是昨天
                    - 昨天 10:10
                其他
                    - 07-10 10:10
    
            如果不是今年
                - 2015-10-29 10:10
    
    
    
    */

    var timeStr: String? {
        //  判断发布微博时间是否为nil
        guard let createAtStr = self.status?.created_at else {
        
            return nil
        }
        
        return NSDate.sinaDate(createAtStr).sinaDateString
        
        
        
        //  代码已经抽取到NSDate+Extension
//        //  代码执行到此,发送微博时间一定有值
//        print(createAtStr)
//        //  Sat Jul 16 14:56:55 +0800 2016
//        //  1. 转换成时间对象
//        let dt = NSDateFormatter()
//        //  指定格式化方式
//        dt.dateFormat = "EEE MMM dd HH:mm:ss z yyyy"
//        //  指定本地化信息
//        dt.locale = NSLocale(localeIdentifier: "en_US")
//        let createAtDate = dt.dateFromString(createAtStr)!
//        print(createAtDate)
//        
//        //  判断年份相当
//        
//        if isThisYear(createAtDate) {
//            //  判断是否是今天
//            //  日历对象
//            let calendar = NSCalendar.currentCalendar()
//            //
//            if calendar.isDateInToday(createAtDate) {
//                //  是今天
//                //  怎么计算发微博时间距离当前时间差多少秒
////                let timeinterval = abs(createAtDate.timeIntervalSinceDate(NSDate()))
////                print(timeinterval)
//                let timeinterval = abs(createAtDate.timeIntervalSinceNow)
//                if timeinterval < 60 {
//                    //  1分钟之前
//                    return "刚刚"
//                } else if timeinterval < 60 * 60 {
//                    //  秒转换成分钟
//                    let result = timeinterval / 60
//                    
//                    return "\(Int(result))分钟前"
//                } else {
//                    
//                    // 秒转换成小时
//                    let result = timeinterval / 3600
//                    return "\(Int(result))小时前"
//                }
//                
//                
//                
//            } else if calendar.isDateInYesterday(createAtDate) {
//                //  昨天
//                dt.dateFormat = "昨天 HH:mm"
//            } else {
//                //  其他
//                dt.dateFormat = "MM-dd HH:mm"
//            }
//            
//            
//            
//            
//            
//        } else {
//            //  不是今年
//            dt.dateFormat = "yyyy-MM-dd HH:mm"
//        }
//        
//        
//        return dt.stringFromDate(createAtDate)
    }
    
    
    //  持有微博模型
    var status: CZStatus?
    //  原创微博富文本
    var originalAttributedStr: NSAttributedString?
    //  转发微博富文本
    var retweetAttributedStr: NSAttributedString?
    init(status: CZStatus) {
        super.init()
        //  初始化持有的微博模型
        self.status = status
        
        retweetStr = handleCount(status.reposts_count, defaultTitle: "转发")
        commentStr = handleCount(status.comments_count, defaultTitle: "评论")
        unlikeStr = handleCount(status.attitudes_count, defaultTitle: "赞")
        
        //  处理转发微博内容显示
        handleRetweetContent(status)
        //  处理会员等级图片
        handleMBrankImage(status.user?.mbrank ?? 0)
        
        //  处理来源字符串
        handleSourceContent(status.source ?? "")
        //  处理认证类型等级图片
        handleVerifiedTypeImage(status.user?.verified_type ?? 0)
        //  处理原创微博内容的富文本
        originalAttributedStr = handleEmoticonContent(status.text!)
        
    }
    
    //  通过微博内容查找表情描述,生成富文本
    private func handleEmoticonContent(statusContent: String) -> NSAttributedString {
        
        let result = NSMutableAttributedString(string: statusContent)
        // 1. regex - 传入的正则表达式
        
        // 闭包参数 1. 匹配个数 ,2 匹配内容的指针, 3. 匹配范围的值 4. 是否停止
        
        var matchResultArray = [CZMatchResult]()
        (statusContent as NSString).enumerateStringsMatchedByRegex("\\[[a-zA-Z0-9\\u4e00-\\u9fa5]+\\]") { (matchCount, matchString, matchRange, _) -> Void in
            //  memory 是取到指针对应的内容
            
            
            if let chs = matchString.memory as? String {
                //  根据表情描述获取表情模型
                
                //  存储匹配内容和匹配范围通过模型
                let matchResult = CZMatchResult(matchString: chs, matchRange: matchRange.memory)
                //  添加到指定元素
                matchResultArray.append(matchResult)
                
                //  在这里找有问题,替换内容越界
//                if let emoticon = CZEmoticonTools.shareTools.selectEmoticonWithChs(chs) {
//                    
//                    //  根据表情表情模型和字体大小创建富文本
//                    let attributedStr = NSAttributedString.attributedStringWithEmoticon(emoticon, font: UIFont.systemFontOfSize(HomeFontSize))
//                    
//                    //  根据匹配到的内容范围替换成我们创建的富文本对象
//                    result.replaceCharactersInRange(matchRange.memory, withAttributedString: attributedStr)
//                    
//                }
               
                
            }
            
            
        }
//        for value in matchResultArray {
//            print(value.matchString)
//            print(value.matchRange)
//        }
        
        //  倒着去替换表情富文本
        for value in matchResultArray.reverse() {
            
            if let emoticon = CZEmoticonTools.shareTools.selectEmoticonWithChs(value.matchString) {
                print(value.matchRange)
                //  根据表情表情模型和字体大小创建富文本
                let attributedStr = NSAttributedString.attributedStringWithEmoticon(emoticon, font: UIFont.systemFontOfSize(HomeFontSize))
                
                //  根据匹配到的内容范围替换成我们创建的富文本对象
                
                result.replaceCharactersInRange(value.matchRange, withAttributedString: attributedStr)
            }
        }
        
        
        return result
        
    }
    
    
    
    
    
    
    /**
        发布微博时间跟我们当前时间的年份进行对比,判断其是否是同一年
     
     - parameter createDate: 发送微博时间
     */
//    private func isThisYear(createDate: NSDate) -> Bool {
//        let dt = NSDateFormatter()
//        dt.dateFormat = "yyyy"
//        //  指定本地化信息
//        dt.locale = NSLocale(localeIdentifier: "en_US")
//        //  把时间对象转成字符串
//        let createDateYear = dt.stringFromDate(createDate)
//        //  把当前时间对象转成字符串
//        let currentDateYear = dt.stringFromDate(NSDate())
//        
//        return createDateYear == currentDateYear
//    }
    
    
    //  处理认证类型等级图片
    private func handleVerifiedTypeImage(verifiedType: Int) {
        
        //  认证类型等级 认证类型 -1 没有认证 ，0 认证用户，2，3，5 企业认证 ， 220 达人
        switch verifiedType {
        
        case 0:
            //  认证用户
            verifiedTypeImage = UIImage(named: "avatar_vip")
        case 2, 3, 5:
            //  企业认证
            verifiedTypeImage = UIImage(named: "avatar_enterprise_vip")
        case 220:
            //  微博达人
            verifiedTypeImage = UIImage(named: "avatar_grassroot")
        default:
            verifiedTypeImage = nil
        }
        
        
    }
    
    
    
    //  处理来源字符串
    private func handleSourceContent(source: String) {
        //  '\'进行字符串转译
        guard let range1 = source.rangeOfString("\">"), let range2 = source.rangeOfString("</") else {
            return
        }
        
        //  代码执行到此,范围一定存在
        
        //  开始光标位置
        let startIndex = range1.endIndex
        //  结束光标位置
        let endIndex = range2.startIndex
        //  截取字符串
        sourceContent = "来自 " + source.substringWithRange(startIndex..<endIndex)
        
        
        
        
        
        
        
        
    
    }
    
    //  处理会员等级图片
    private func handleMBrankImage(mbrank: Int) {
        
        if mbrank >= 1 && mbrank <= 6 {
            let image = UIImage(named:"common_icon_membership_level\(mbrank)")
            mbrandImage = image
        }
        
        
    }
    
    //  处理转发微博内容显示
    private func handleRetweetContent(status: CZStatus) {
        
        if status.retweeted_status != nil {
            
            
            //  获取转发用户的名字
            guard let name = status.retweeted_status?.user?.screen_name, let text = status.retweeted_status?.text else {
                return
            }
            
            //  代码执行到此name和转发微博内容一定有值
            
            retweetContent = "@\(name):\(text)"
            //  转发微博内容转成富文本
            retweetAttributedStr = handleEmoticonContent(retweetContent!)
            
        }
        
        
    }
    
    
    //  处理显示 转发, 评论, 赞的数据样式
    /*
        1. 判断count 是否 大于 0
              - 判断 count 是否大于等于10000
                    - 对10000这样的数据进行格式化处理
              - 否则 - 直接显示应有的数字
           否则显示默认标题
    
    */
    private func handleCount(count: Int, defaultTitle: String) -> String {
        
        if count > 0 {
            if count >= 10000 {
                //  进行格式化处理
                let result = Float(count / 1000) / 10
                
                var resultStr = "\(result)万"
                
                if resultStr.containsString(".0") {
                    resultStr = resultStr.stringByReplacingOccurrencesOfString(".0", withString: "")
                }
                
                return resultStr
                
                
                
            } else {
               return "\(count)"
            }
        
        } else {
            return defaultTitle
        }
        
        
        
        
    }
    
    
    
    
    
    
    
    
    
    
    
    
    

}
